问题:order by 排序字段会不会使用索引?
创建表结构
DROP TABLE IF EXISTS test.test;
CREATE TABLE test.test(
id int(10) not null auto_increment,
a int(10) not null,
b int(10) not null,
c int(10) not null,
PRIMARY key (`id`)
)ENGINE INNODB DEFAULT CHARSET utf8 COMMENT '测试表';
批量插入1000万条
mysql> explain select * from test order by b desc limit 10;
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
| 1 | SIMPLE | test | NULL | ALL | NULL | NULL | NULL | NULL | 9979716 | 100.00 | Using filesort |
+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+
1 row in set, 1 warning (0.00 sec)
现象:执行计划是全盘扫描
增加索引
mysql> ALTER TABLE test ADD INDEX idx_b (b);
Query OK, 0 rows affected (12.57 sec)
再次查询
mysql> explain select * from test order by b desc limit 10;
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
| 1 | SIMPLE | test | NULL | index | NULL | idx_b | 4 | NULL | 10 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+-------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
现象:命中索引,执行计划只扫描10行
结论:order by后面的的字段需要创建索引。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。